/*****************************************************************************/
/*                                                                           */
/*    Domino Operation System Driver Module                                  */
/*                                                                           */
/*    Copyright (C) 2011 Laszlo Arvai                                        */
/*                                                                           */
/*    ------------------------------------------------------------------     */
/*    System Timer (1ms) Driver for PIC24 Series                             */
/*****************************************************************************/

///////////////////////////////////////////////////////////////////////////////
// Includes
#define USE_AND_OR /* To enable AND_OR mask setting */
#include <timer.h>
#include <krnlTypes.h>
#include <krnlSystemTimer.h>
#include "drvIOConfig.h"

// Calculate clock rate for the 1ms (1000 interrupts/second)
#define TIMER_TICK_RATE       ((sysCLOCK_FREQUENCY/2) / (krnlSYSTEM_TIMER_TICKS_PER_SECOND)-1)

///////////////////////////////////////////////////////////////////////////////
// Module local variables
static volatile dosWord l_system_time = 0;

///////////////////////////////////////////////////////////////////////////////
// Initialize system timer
void krnlInitSystemTimer(void)
{
 	// Open Timer1
  ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_1);			// Enable Interrupt
	OpenTimer1(T1_ON, TIMER_TICK_RATE);								//Timer is configured for 1 msec
}

///////////////////////////////////////////////////////////////////////////////
// Interrupt handler
void __attribute__ ((interrupt,no_auto_psv)) _T1Interrupt (void)
{
	T1_Clear_Intr_Status_Bit;

  // increment TickCount
  l_system_time++;       
}

///////////////////////////////////////////////////////////////////////////////
// Get system timer
dosWord krnlGetSystemTimer(void)
{
	return l_system_time;
}
